<?php
/**
* 建行交易基本参数
*/
class Ccbconf
{
    /**
     * 请求序列号 varChar(16) 只可以使用数字
     */
    private $requestSn;

    /**
     * 客户号 字符型char，网银客户号 varChar(21)
     */
    private $custId  = 'P574361008#05';

    /**
     * 操作员号 varChar(6)
     */
    private $userId  = 'WLPT01';

    /**
     * 操作员密码 varChar(32)
     */
    private $password  = 'bz654321';

    /**
     * 语言 CN 中文
     */
    private $language  = 'CN';

    /**
     * 建行交易码
     */
    private $txCode;

    private $xml;

    /**
     * 动态实例化的的句柄
     */
    private $_confHandler;

    function __construct($code, $parameter)
    {
        $this->setTxCode($code);
        $this->setRequestSn($parameter);
        $this->setConfHandler($parameter);
    }

    public function setTxCode($code)
    {
        $this->txCode = $code;
    }

    private function setConfHandler($parameter)
    {
        $class = 'Conf'. strtolower($this->txCode);
        if ( ! class_exists($class)) {
            throw new Exception("{$class} ：没有定义", 1);
        }

        $this->_confHandler = new $class($this, $parameter);
    }

    public function getXml()
    {
        $this->_confHandler->getTransaction();
        return $this->xml;
    }

    /**
     * 获取交易头部
     */
    public function getTransactionHeader()
    {
        /**
         * 请求序列号 varChar(16) F 只可以使用数字
         */
        $this->xml['REQUEST_SN'] = $this->requestSn;

        /**
         * 客户号 varChar(21) F 字符型char，网银客户号 
         */
        $this->xml['CUST_ID'] = $this->custId;

        /**
         * 操作员号 varChar(6) F 20051210后必须使用 
         */
        $this->xml['USER_ID'] = $this->userId;

        /**
         * 密码 varChar(32) F 操作员密码 
         */
        $this->xml['PASSWORD'] = $this->password;

        /**
         * 交易码 varChar(6) F 交易请求码
         */
        $this->xml['TX_CODE'] = $this->txCode;

        /**
         * 语言 varChar(2) F CN中文
         */
        $this->xml['LANGUAGE'] = $this->language;

        /**
         * 交易内容
         */
        $this->xml['TX_INFO'] = $this->_confHandler->getTransactionBody();
    }

    public function getTransactionSign()
    {
        /**
         *  签名信息 varChar(254)
         */
        $this->xml['SIGN_INFO'] = '';

        /**
         *  签名CA信息 varChar(254) 
         */
        $this->xml['SIGNCERT'] = '';
    }

    /**
     * 用户序列号
     */
    private function setRequestSn($parameter)
    {
        if ( empty($parameter['REQUEST_SN']) || ! $parameter['REQUEST_SN'] > 0 || strlen($parameter['REQUEST_SN']) > 16 ) {
            throw new Exception("请求序列号, 只可以使用数字", 1);
        }
        $this->requestSn = $parameter['REQUEST_SN'];
    }

    /**
     * 解析返回的数据  返回回来的数据有2种 所以解析的方式不一样
     * 1，单笔交易 查询和转账基本一样
     * 2，批量交易 查询和转账区别很大  所以需要单独写
     */
    public function parsesResult($response)
    {
        $transaction = array();
        if (method_exists($this->_confHandler, 'parsesResult')) { // 是否有自己的方法处理
            $transaction = $this->_confHandler->parsesResult($response);
        } else {
            $transaction['status'] = 2; //交易失败
            $transaction['response_content'] = json_encode($response);
            if (isset($response->TX_INFO->DEAL_RESULT)) { //单笔查询
                $dealResult = (int)$response->TX_INFO->DEAL_RESULT;
                $transaction['message'] = $this->getReturnCodeMsg($dealResult). " | ". (string)$response->RETURN_MSG. " | ". (string)$response->TX_INFO->MESSAGE;
                if ( (string)$response->RETURN_CODE === '000000' && $dealResult == 4 ) { // 验证是否转账成功
                    $transaction['status'] = 3; //交易成功
                }
            } else { //单笔转账
                $transaction['message'] = (string)$response->RETURN_MSG;
                if ( (string)$response->RETURN_CODE === '000000' ) { // 验证是否转账成功
                    $transaction['status'] = 3; //交易成功
                }
            }
        }
        return $transaction;
    }

    /**
     * 单笔交易查询  返回交易代码
     */
    private function getReturnCodeMsg($code)
    {
        switch ($code) {
            case 1:
                return '复核中';
            case 2:
                return '复核完毕，等待账务系统处理';
            case 3:
                return '失败';
            case 4:
                return '成功';
            case 6:
                return '不确定';
            default:
                return null;
        }
    }
}